package rainbowPackage;

import javafx.scene.paint.Paint.*;
import javafx.scene.paint.Color;
import javafx.geometry.Rectangle2D;

public class Diagnostics
{
	public Rectangle2D Bounds = new Rectangle2D( 0, 0, 1920, 1080 );
	public double[] RGB = {0,0,0};// = {0,0,0};
	public double[] ARGB = {0,0,0,1};// = {0,0,0};
	public Color FXColor;
	ColorSlider black = new ColorSlider( new double[]{0,0,0} );
	ColorSlider white = new ColorSlider( new double[]{255,255,255} );
	ColorSlider skyblue = new ColorSlider( new double[]{134,206,249} );
	ColorSlider oxylblue = new ColorSlider( new double[]{0,255,255} );
	ColorSlider pink = new ColorSlider( new double[]{255,64,143} );
	ColorSlider blue = new ColorSlider( new double[]{0,0,192} );
	ColorSlider red = new ColorSlider( new double[]{193,0,0} );
	ColorSlider purple = new ColorSlider( new double[]{122,0,178} );
	ColorSlider orange = new ColorSlider( new double[]{255,134,0} );
	ColorSlider green = new ColorSlider( new double[]{0,133,50} );
	ColorSlider yellow = new ColorSlider( new double[]{246,252,15} );
	ColorSlider teal = new ColorSlider( new double[]{3,224,149} );
	ColorSlider bronze = new ColorSlider( new double[]{152,123,46} );
	ColorSlider silver = new ColorSlider( new double[]{193,192,192} );
	ColorSlider gold = new ColorSlider( new double[]{205,191,44} );
	ColorSlider lime = new ColorSlider( new double[]{126,193,33} );
	ColorSlider brown = new ColorSlider( new double[]{131,103,71} );
	ColorSlider neongreen = new ColorSlider( new double[]{0,255,0} );
	ColorSlider oxylblue0FF = new ColorSlider( new double[]{0,255,255} );
	int oxylblue0FFNum = (int)(255 * 16777216) + (int)(0 * 65536) + (int)(255 * 256) + 255;
	ColorSlider color = black;
	TransparencySlider colorTransparency = new TransparencySlider( new double[]{0,0,0,1} );
	int xRectangleNum = 0, yRectangleNum = 0;
	public double ColorBeingChecked = 0, OpacityBeingChecked = 1, xSlid = 0;

	public Diagnostics ( Rectangle2D Bounds )
	{
		this.Bounds = Bounds;
	}
	public Color ToFXColor ()//8th Square BasicDiagnosticsClass.java
	{
		this.FXColor = FXColor.rgb( (int)(ColorValueFitter(RGB[0])), (int)(ColorValueFitter(RGB[1])), (int)(ColorValueFitter(RGB[2])) );
		return FXColor;
	}
	public Object ColorSlider( double x, double y, double xSlider, double BrightnessMultiplyer, int Gradations )
	{
		int xRectangleQuantity = 3, yRectangleQuantity = 5;
		for ( xRectangleNum = 0; xRectangleNum < xRectangleQuantity; xRectangleNum++ )
			if ( x >= Bounds.getMinX() + Bounds.getWidth() * xRectangleNum / xRectangleQuantity && x <= Bounds.getMinX() + Bounds.getWidth() * ( xRectangleNum + 1 ) / xRectangleQuantity )
				break;
		for ( yRectangleNum = 0; yRectangleNum < yRectangleQuantity; yRectangleNum++ )
			if ( y >= Bounds.getMinY() + Bounds.getHeight() * yRectangleNum / yRectangleQuantity && y <= Bounds.getMinY() + Bounds.getHeight() * ( yRectangleNum + 1 ) / yRectangleQuantity )
				break;
		xSlid = ( x - xSlider ) / xRectangleQuantity - Bounds.getMinX();
		while ( xSlid < 0 )
			xSlid = xSlid + Bounds.getWidth() / xRectangleQuantity );
		while ( xSlid > Bounds.getWidth() / xRectangleQuantity )
			xSlid = xSlid - Bounds.getWidth() / xRectangleQuantity;
		switch ( yRectangleNum )
		{
		case 0:
			switch ( xRectangleNum )
			{
			case 0:
				color = new ColorSlider();
				break;
			case 1:
				color = new ColorSlider( white.FXColor );
				break;
			case 2:
				color = new ColorSlider( green.RGB );
				break;
			}
			break;
		case 1:
			switch ( xRectangleNum )
			{
			case 0:
				color.ColorSliderFunction( Bounds.getWidth(), xSlid, green, purple );
				break;
			case 1:
				color.ColorSliderFunction( Bounds.getWidth(), xSlid, BrightnessMultiplyer, blue, green );
				break;
			case 2:
				color.ColorSliderFunction( Bounds.getWidth(), xSlid, purple, green, Gradations );
				break;
			}
			break;
		case 2:
			switch ( xRectangleNum )
			{
			case 0:
				color.ColorSliderFunction( Bounds.getWidth(), xSlid, BrightnessMultiplyer, purple, green, Gradations );
				break;
			case 1:
				new ColorSlider ( color.ToFXColor() );
				break;
			case 2:
				color = new ColorSlider ( color.ToFXColor( pink.RGB ) );
				break;
			}
			break;
		case 3:
			switch ( xRectangleNum )
			{
			case 0:
				color.ColorSliderFunction( Bounds.getWidth(), xSlid, blue, oxylblue0FF );
				int tempColorNum = (int)((int)( 255 * 16777216) + (int)(color.ToFXColor().getRed() * 255 * 65536) + (int)(color.ToFXColor().getGreen() * 255 * 256) + color.ToFXColor().getBlue() * 255);
				if ( color.ColorTooSimilarFunction( tempColorNum, oxylblue0FFNum ) )
					color = neongreen;
				break;
			case 1:
				color.ColorSliderFunction( Bounds.getWidth(), xSlid, purple, oxylblue0FF );
				if ( color.ColorTooSimilarFunction( color, oxylblue0FF ) )
					color = neongreen;
				break;
			case 2:
				if ( 0 <= color.ColorValueFitter(5000) && color.ColorValueFitter(5000) <= 255  && 0 <= color.ColorValueFitter(-5000) && color.ColorValueFitter(-5000) <= 255 )
					color = white;
				else
					color = black;
				break;
			}
			break;
		case 4:
			switch ( xRectangleNum )
			{
			case 0:
				color.set( FXColor.AQUAMARINE );
				break;
			case 1:
				color.set( new double[]{255,134,0} );
				break;
			case 2:
				color = new ColorSlider ( gold.RGB );
				break;
			}
			break;
		}
		this.RGB = color.RGB;
		for  (int z = 0; z <= 2; z++)
		{
			RGB[z] = ColorValueFitter(color.RGB[z]);
			ARGB[z] = ColorValueFitter(RGB[z]);
		}
		ARGB[3] = 1;
		this.colorTransparency = new TransparencySlider( ARGB );
		this.FXColor = color.ToFXColor();
		return color;
	}
	public Boolean ColorTooSimilarFunction(ColorSlider Color1, ColorSlider Color2)//11th Square BasicDiagnosticsClass.java
	{
		Boolean TooSimilar = false;
		int colorDifference = (int)( Math.abs(Color1.RGB[0] - Color2.RGB[0]) + Math.abs(Color1.RGB[1] - Color2.RGB[1]) + Math.abs(Color1.RGB[2] - Color2.RGB[2]) );
		if ( colorDifference <= 164 )
			TooSimilar = true;
		else
			TooSimilar = false;
		//System.out.println("colorDifference: " + colorDifference);
		//System.out.println(TooSimilar);
		return TooSimilar;
	}
	public double ColorValueFitter ( double ColorToBeChecked )//12th Square BasicDiagnosticsClass.java
	{
		this.ColorBeingChecked = Math.abs(ColorToBeChecked);
		while ( ColorBeingChecked > 255)
			this.ColorBeingChecked = ColorBeingChecked - 255;
		return ColorBeingChecked;
	}
	public double OpacityValueFitter ( double OpacityToBeChecked )//36th Square BasicDiagnosticsClass.java
	{
		this.OpacityBeingChecked = Math.abs(OpacityToBeChecked);
		while ( OpacityBeingChecked > 1)
			this.OpacityBeingChecked = OpacityBeingChecked - 1;
		return OpacityBeingChecked;
	}
	public void set(double[] RGB) { this.RGB = RGB; this.FXColor = FXColor.rgb( (int)(ColorValueFitter(RGB[0])), (int)(ColorValueFitter(RGB[1])), (int)(ColorValueFitter(RGB[2])) ); }//13th Square BasicDiagnosticsClass.java
	public void set(Color FXColor) { this.FXColor = FXColor; this.RGB = new double[] { ColorValueFitter(FXColor.getRed() * 255), ColorValueFitter(FXColor.getGreen() * 255), ColorValueFitter(FXColor.getBlue() * 255) }; }//14th Square BasicDiagnosticsClass.java
	public Object get() { return RGB; }
}
